/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * HOJA DE TRABAJO #6
 * Fecha de Entrega: Martes 6 de Septiembre de 2011
 */

/**
 * Programa principal de la aplicación de simulación de colas de un Banco. 
 * @author José Antonio Bagur - 10275
 */

/* SE IMPORTAN LAS LIBRERÍAS A UTILIZAR EN EL PROGRAMA */   
import java.util.*;
        
public class DriverBanco extends Banco {
    
        static int opcion, hora, horal, horae, tiempo = 0, e = 0;
        static boolean fin = false;
        static boolean parar = false;
        static boolean lleno = false;
        static boolean salida = false;
        static boolean opclientes = false;
        static boolean opactividad = false;
        static int check = 0;
        static Scanner ingresoc = new Scanner(System.in);
        static Scanner ingreso = new Scanner(System.in);
    
    /* DEFINICIÓN DEL MÉTODO MAIN */
    public static void main (String[] args) throws QueueOverflow, QueueUnderflow, BancoLleno {
                      
        System.out.println("|--------------------|");
        System.out.println("|  BANCO INDUSTRIAL  |");
        System.out.println("|--------------------|"); 
        
        do {
            menu();
            System.out.println("\n");
            opcion = (int)obtenerOpcion("| - Ingrese la opción a la que desea ingresar: ", false);
            System.out.println("\n");
            System.out.println("\n");
            
            switch (opcion) {
                case 1:
                    if (opclientes == false) {
                        opclientes = true;
                        e = 0;
                        horal = 0;
                        horae = 0;
                        System.out.println("|-------------------------|");
                        System.out.println("| - INGRESO DE CLIENTES - |");
                        System.out.println("|-------------------------|");
                        System.out.println("\n");
                        while(fin != true) {
                            System.out.print("* - Ingrese la hora de entrada del Cliente #" + (e+1) + " (-1 PARA FINALIZAR): ");
                            horal = ingresoc.nextInt();
                            if(horal > 0 && horal < 481 && horal != -1) {
                                System.out.print("* - Ingrese la hora de espera del Cliente #" + (e+1) + ": ");
                                horae = ingresoc.nextInt();
                                if (horae != -1 && horae >= 1 && horae < 31) {
                                    System.out.println("\n");
                                    clientes[e] = new Cliente(horal, horae);
                                    e++;
                                    tiempo = tiempo + horae;
                                } else {
                                    System.out.println("| - ¡DEBE INGRESAR LA HORA DE ESPERA DEL CLIENTE!");
                                    System.out.println("\n");
                                    System.out.print("* - Ingrese la hora de espera del Cliente #" + (e+1) + ": ");
                                    horae = ingresoc.nextInt();
                                }
                            } else if (horal == -1) {
                                System.out.println("\n");
                                fin = true;
                            } 
                        }

                        for (int i = 0; i < 4; i++) {
                            colas[i] = new ListaBanco(10);
                        }


                        for (int i = 0; i < e; i++) {
                            colasalida2.add(clientes[i]);
                        }
                    } else {
                        System.out.println("\n");
                        System.out.println("* - YA SE INGRESARON LOS CLIENTES AL SISTEMA");
                        System.out.println("\n");
                    }
                    break;
                case 2: 
                    actividadesBanco();
                    break;
                case 3:
                    System.out.println("\n");
                    System.out.println("-----> GRACIAS POR UTILIZAR NUESTRO PROGRAMA <-----");
                    salida = true;
                    break;
                default:
                    System.out.println("-----> OPCION NO VALIDA <-----");
                    break;
            }                
        } while (!salida);
    }
    
    public static void actividadesBanco() {
         if (opclientes == true) {
                        System.out.println("|---------------------------|");
                        System.out.println("| - ACTIVIDADES DEL BANCO - |");
                        System.out.println("|---------------------------|");
                        System.out.println("\n");
                        System.out.print("* - Ingrese el minuto que desea revisar (1 - 480): ");
                        hora = ingreso.nextInt();
                        System.out.println("\n");
                        if (hora >= check) {
                            check = hora;
                            while((!colasalida2.isEmpty() && (!parar)))
                                if (colasalida2.peek().getLlegada() <= hora)
                                    if(!getBancoLleno())
                                        try {
                                            clientesQueue(colasalida2.remove());
                                        } catch (Exception s) {}
                                    else {
                                        parar = true;
                                        lleno = true;
                                        System.out.println("\n");
                                        System.out.println("\n");
                                        System.out.println("| - LO SENTIMOS, EL BANCO ESTÁ LLENO");
                                        System.out.println("| - SE ATENDERÁN A LOS CLIENTES QUE SE ENCUENTRAN DENTRO DEL BANCO");
                                        System.out.println("\n");
                                        System.out.println("\n");
                                    }
                                else
                                    parar = true;
                            parar = false;
                            if (colasalida2.isEmpty() || lleno) {
                                System.out.println("\n");
                                System.out.println("| - LISTA DE EVENTOS VACÍA...");
                                System.out.println("| - SE ATENDERÁN A LOS CLIENTES QUE SE ENCUENTRAN DENTRO DEL BANCO...");
                                System.out.println("\n"); 
                                try {
                                    clientesDequeue(800);    
                                } catch (Exception s) {}
                                setTiempoPromedio(tiempo/contadorAtendidos);
                                System.out.println("\n");
                                System.out.println("| - SE ATENDIERON DURANTE ESTE DÍA A: " + contadorAtendidos + " CLIENTES");
                                System.out.println("| - EL TIEMPO PROMEDIO QUE LAS PERSONAS ESTUVIERON EN EL BANCO FUE DE: " + getTiempoPromedio() + " MINUTOS");
                                salida = true;
                            }
                        } else {
                            System.out.println("\n");
                            System.out.println("\n");
                            System.out.println("-----> OPCION NO VALIDA <----- | INGRESE UN MINUTO CORRECTO");
                        }
                    } else {
                        System.out.println("\n");
                        System.out.println("* - NO SE HAN INGRESADO CLIENTES AL SISTEMA");
                        System.out.println("\n");
                    }
    }
    
     /* MÉTODO MENU */   
    
    /**
     * Método que permite desplegar un menu de opciones para el usuario en pantalla.
     */
    public static void menu() {
        System.out.println();
        System.out.println("| ------------- MENU DE OPCIONES ------------- |");
        System.out.println("| 1. Ingreso de Clientes.                      |");
        System.out.println("| 2. Ver Actividades.                          |");
        System.out.println("| 3. Salir de la aplicación.                   |");
        System.out.println("| -------------------------------------------- |"); 
    }
    
    /* MÉTODO OBTENEROPCION */
    
    /**
     * Método que permite solicitar información al usuario.
     * @param mensaje Solicita al usuario que ingrese su opción.
     * @param error Estado del error.     
     * @return num -1
     */
    public static double obtenerOpcion(String mensaje, boolean error){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        System.out.print(mensaje);
        
        /* INICIO DEL MANEJO DE EXEPCIONES */
        
        try {
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception) {
            if (error)
                System.out.println("| -----------> ERROR: OPCION NO VALIDA |"); 
        }
        finally {
            ingreso.nextLine(); // ATRAPA EL "ENTER"
        }
        return num;
    }
    
}
